package com.liuqing.www.java基础知识.事件模型;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * 事件处理模型三要素：
 * 事件源：接受事件的对象
 * 事件对象：记录事件源以及处理该事件所需要的信息常以event结尾
 * 事件监听器listener、adapter
 * 事件源注册事件监听器，事件发生时虚拟里产生个事件对象，事件源接收到事件对象，则启动事件
 * 监听器，并将事件对象传递给时间监听器
 * @author 韩世超
 *
 */
public class 自定义事件 {
	public static void main(String[] args) {
//		J_BUTTON.toshow();
		EventSource.toGO();
	}
}
/******************以下是使用自定义事件的简单例子***********************/
class EventSource {//数据源不用继承任何类或接口
	List<EventListener> li=new ArrayList<EventListener>();//EventListenerList
	 public synchronized void addMyListener(EventLister ml)
	 {
		 	li.add(ml);
	 }
	    
	 public synchronized void removeMyListener(EventLister ml)
	 {
	   	li.remove(ml);
	 }
	 public void activateMyEvent()
	 {
	        synchronized(this)
	        {
	         
	            
	            for(int i=0;i<li.size();i++)
	            {  Event e=new Event(this);
	            	EventLister ml=(EventLister)li.get(i);
	                ml.eventActive(e);
	            }
	        }   
	   }
	 public static void toGO(){
		 EventSource Source=new EventSource();
		 Source.addMyListener(new EventLister());
		 Source.activateMyEvent();
	 }

}
class Event extends EventObject{//时间对象

	public Event(Object source) {
		super(source);
	}
	
}
class EventLister implements EventListener{//时间对象
	public void eventActive(Event e){
		System.out.print("事件被触发");
	}
}
/******************以下是使用本身事件的简单例子***********************/
class J_BUTTON extends JFrame{
	public J_BUTTON(){
		super("cece");
		Container c=this.getContentPane();
		JButton b=new JButton("点击0次");
		J_ActionListener li=new J_ActionListener();
		b.addActionListener(li);
		c.add(b);
	}
	static void toshow(){
		J_BUTTON j=new J_BUTTON();
		j.setSize(100,100);
		j.setVisible(true);
	}
}
class J_ActionListener implements ActionListener{//继承与EventListener
	int num=0;
	@Override
	public void actionPerformed(ActionEvent e) {
		num++;
		JButton j=(JButton)e.getSource();
		j.setText("点击"+num+"次");
	}
	
}
